package com.java8;

import java.util.Arrays;
import java.util.function.Consumer;

/**
 * numbers.stream().filter(i -> i % 2 == 0).distinct().forEach(System.out::println);
 * 
 * -> 是Java 8新增的Lambda表达式中，变量和临时代码块的分隔符，即: (变量) -> {代码块}
 * 
 * ::是类似于C++的域运算符，获取方法使用的。
 * 
 * stream()也是JDK8新增的流，你的表达式中将numbers转换为流，就可以惰性处理，这样只有变量要用的时候才会被调用，
 * 专门处理较多的数字或者字符串（如配合readAllLines()方法使用），i -> i % 2 == 0就是自动判断了i的类型（可能是int型，我没法判断），
 * 这样就将numbers中所有的偶数过滤出来了（distinct()保证了每个数字只保留一个），然后将这些过滤出的数字每个占用一行地打印出来。
 */
public class LambdaTest {

	public static void main(String args[]) {
		LambdaTest tester = new LambdaTest();

		// 类型声明
		MathOperation addition = (int a, int b) -> a + b;

		// 不用类型声明
		MathOperation subtraction = (a, b) -> a - b;

		// 大括号中的返回语句
		MathOperation multiplication = (int a, int b) -> {
			return a * b;
		};

		// 没有大括号及返回语句
		MathOperation division = (int a, int b) -> a / b;

		System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
		System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
		System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
		System.out.println("10 / 5 = " + tester.operate(10, 5, division));

		// 不用括号
		GreetingService greetService1 = message -> System.out.println("Hello " + message);

		// 用括号
		GreetingService greetService2 = (message) -> System.out.println("Hello " + message);

		greetService1.sayMessage("Runoob");
		greetService2.sayMessage("Google");

		String str = "aaa ";
		GreetingService greetService3 = message -> System.out.println(str + message);
		greetService3.sayMessage("bbb");

		String[] strings = {"1","2","3","4"};
		Arrays.asList(strings).forEach(greetService3::sayMessage);
	}

	interface MathOperation {
		int operation(int a, int b);
	}

	interface GreetingService {
		void sayMessage(String message);
	}

	private int operate(int a, int b, MathOperation mathOperation) {
		return mathOperation.operation(a, b);
	}

}
